#pragma once

#include <algorithm>
#include <openssl/md5.h>
#include "../hash.hpp"

namespace alpha { namespace crypto {
	
namespace detail {
		
struct md5_traits
{
	enum {digest_length = 16};

	typedef MD5_CTX context_type;

	static void init(context_type *ctx)
	{
		MD5_Init(ctx);
	}

	static void update(context_type *ctx, boost::uint8_t const *buf, boost::uint32_t len)
	{
		MD5_Update(ctx, buf, len);
	}

	static void final(boost::uint8_t *digest, context_type *ctx)
	{
		MD5_Final(digest, ctx);
	}

};

} // namespace detail

typedef basic_hash<detail::md5_traits> md5;

}} // namespace alpha::crypto
